class WarnPlugin {
  constructor (plugin) {
    this.plugin = plugin
    this.open = function () {
      console.log('WarnPlugin open', this.plugin)
    }
  }
  stop () {
    // 添加在原型上的属性
    console.log('WarnPlugin stop')
  }
}
class PreviewPlugin extends WarnPlugin {
  constructor (plugin) {
    super()
    // 父类静态方法不可调用
    // super作用为调用父类的方法
    // surper传参是传递给父类的构造器
    // this指向类的实例,构造器中的属性是实例属性
    // 子类继承父类，构造器生命函数会替换父类重名函数、属性
    this.plugin = plugin
  }
}
class PlaybackPlugin extends WarnPlugin {
  constructor (plugin) {
    super()
    this.plugin = plugin
  }
}
class TvwallPlugin extends WarnPlugin {
  constructor (plugin) {
    super()
    this.plugin = plugin
  }
}
class DefaultPlugin {
  constructor (plugin, videoType) {
    if (new.target !== DefaultPlugin) {
      throw new Error('必须使用 new 命令生成实例')
    }
    this.plugin = plugin
    this.videoType = videoType
    videoType.forEach(fName => {
      // 将传入的方法名挂载在对象上
      this[fName] = () => {
        console.log(fName)
      }
    })
  }
  open () {
    console.log('DefaultPlugin')
  }
}

export default function importApi (plugin, videoType) {
  if (typeof videoType === 'string') {
    switch (videoType) {
      case '预览':
        return new PreviewPlugin(plugin)
      case '回放':
        return new PlaybackPlugin(plugin)
      case '报警':
        return new WarnPlugin(plugin)
      case '电视墙':
        return new TvwallPlugin(plugin)
      default:
        return new PreviewPlugin(plugin)
    }
  } else {
    return new DefaultPlugin(plugin, videoType)
  }
}
